
# -*- coding: utf-8 -*-

from django.shortcuts import render_to_response
from django.core.exceptions import ObjectDoesNotExist
from models import Departamentos, DepartamentosForm
from comunidadcyt.util.permisos import puedeCrearDepartamento, puedeEditarDepartamento
from django.http import HttpResponse
from django.utils import simplejson
from django.shortcuts import redirect
from django.core.urlresolvers import reverse
from django.views.generic.create_update import update_object, create_object , delete_object
from django.views.generic.list_detail import object_list
from django.template.context import RequestContext
from comunidadcyt.Publicaciones.models import Libros, Conferencias, Papers, Tesis, Revistas, ReportesTecnicos
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import  ParagraphStyle as PS
from reportlab.platypus import SimpleDocTemplate, Paragraph, Image
from reportlab.platypus import Table, TableStyle, PageBreak
from reportlab.lib import colors
from reportlab.platypus import Spacer
from reportlab.lib.units import inch
import unicodedata
import os

def obtenerDepto(request , object_id):
    if int(object_id):
        try:
            objetoDpto = Departamentos.objects.get(id=object_id)
        except ObjectDoesNotExist:
            return 'No existe el objeto departamento'
    else:
        return 'No existe el objeto departamento'
    return objetoDpto

def inicio(request):
    request.breadcrumbs('Departamentos',request.path)
    return object_list(
        request,
        queryset = Departamentos.objects.all().order_by('Nombre_departamento'),
        allow_empty = True,
        template_name = 'depto/listarDepartamentos.html'
    )

def ver(request, object_id):
    depto = obtenerDepto(request, object_id)
    if depto == 'No existe el objeto departamento':
        return render_to_response('error.html',{'error':'No existe el objeto departamento', 'archivo': 'view de departamentos', 'linea': 'linea 20'})

    request.breadcrumbs([('Departamentos',reverse(inicio)),('Ver '+depto.Nombre_departamento,request.path)])
    return render_to_response(
        'depto/detalles.html',
        {'Departamento': depto, 'puedeEditar': puedeEditarDepartamento(request.user, depto)},
        context_instance = RequestContext(request)
    )
    
def crear(request):
    if puedeCrearDepartamento(request.user):
        request.breadcrumbs([('Departamentos',reverse(inicio)),('Crear',request.path)])
        return create_object(
            request,
            form_class = DepartamentosForm,
            template_name = 'depto/depto.html',
            post_save_redirect = '/comunidadcyt/departamentos'
        )

    return redirect(reverse(inicio(request)))

def editar(request, object_id):
    depto = obtenerDepto(request, object_id)
    if depto == 'No existe el objeto departamento':
        return render_to_response('error.html',{'error':'No existe el objeto departamento', 'archivo': 'view de departamentos', 'linea': 'linea 20'})

    if puedeEditarDepartamento(request.user, depto):
        request.breadcrumbs([('Departamentos',reverse(inicio)),('Editar '+depto.Nombre_departamento,request.path)])
        return update_object(
            request,
            model = Departamentos,
            form_class=DepartamentosForm,
            template_name = 'depto/depto.html',
            post_save_redirect = '/comunidadcyt/departamentos',
            object_id = object_id
        )

    return redirect(reverse(inicio(request)))

def borrar(request, object_id):
    depto = obtenerDepto(request, object_id)
    if depto == 'No existe el objeto departamento':
        return render_to_response('error.html',{'error':'No existe el objeto departamento', 'archivo': 'view de departamentos', 'linea': 'linea 20'})

    if puedeEditarDepartamento(request.user, depto):
        request.breadcrumbs([('Departamentos',reverse(inicio)),('Borrar '+depto.Nombre_departamento,request.path)])
        return delete_object(
            request,
            model = Departamentos,
            template_name = 'depto/confirm_delete.html',
            post_delete_redirect = '/comunidadcyt/departamentos',
            object_id = object_id
        )

    return redirect(reverse(inicio(request)))

def obtenerProyectos(depto):
    list_grupos = list(depto.grupos.all())
    list_proyectos = list(depto.proyectos.all())
    for grupo in list_grupos:
        for proy in grupo.proyectos.all():
            if not list_proyectos.__contains__(proy):
                list_proyectos.append(proy)
    return list_proyectos

def obtenerMiembros(depto):
    list_grupos = depto.grupos.all()
    list_proyectos = depto.proyectos.all()
    list_miembros = []
    for grupo in list_grupos:
        for miembros in grupo.Miembros.all():
            if not list_miembros.__contains__(miembros):        
                list_miembros += [miembros]
    for proy in list_proyectos:
        for miembros in proy.Miembros.all():
            if not list_miembros.__contains__(miembros):        
                list_miembros += [miembros]    
    return list_miembros

def obtenerLineas(depto):
    list_grupos = depto.grupos.all()
    list_proyectos = depto.proyectos.all()
    list_lineas = []
    for grupo in list_grupos:
        for lineas in grupo.Lineas.all():
            if not list_lineas.__contains__(lineas):        
                list_lineas += [lineas]
    for proy in list_proyectos:
        for lineas in proy.Lineas.all():
            if not list_lineas.__contains__(lineas):        
                list_lineas += [lineas]    
    return list_lineas
    
def obtenerPartners(depto):
    list_proyectos = depto.proyectos.all()
    list_partners = []
    for proyecto in list_proyectos:
        for part in proyecto.Partners.all():
            if not list_partners.__contains__(part):
                list_partners += [part]
    return list_partners
 
def listareventos(request, object_id=0):
    depto = obtenerDepto(request, object_id)
    if depto == 'No existe el objeto departamento':
        return render_to_response('error.html',{'error':'No existe el objeto departamento', 'archivo': 'view de departamentos', 'linea': 'linea 20'})
    
    request.breadcrumbs([('Departamentos',reverse(inicio)),('Listar Eventos de '+depto.Nombre_departamento,request.path)])
    return render_to_response('depto/eventos.html', {'Departamento': depto, 'list_eventos': depto.eventos.all(), 'user': request.user}, context_instance=RequestContext(request))


def listarpublicaciones(request, object_id=0):
    depto = obtenerDepto(request, object_id)
    miembros = obtenerMiembros(depto)
    if depto == 'No existe el objeto departamento':
        return render_to_response('error.html',{'error':'No existe el objeto departamento', 'archivo': 'view de departamentos', 'linea': 'linea 20'})

    request.breadcrumbs([('Departamentos',reverse(inicio)),('Listar Publicaciones de '+depto.Nombre_departamento,request.path)])
    if miembros.__contains__(request.user):
        return render_to_response('depto/publicaciones.html', {'Departamento': depto, 
                                                           'books': Libros.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento),
                                                           'magazines': Revistas.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento),
                                                           'tesis': Tesis.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento),
                                                           'papers': Papers.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento),
                                                           'reports': ReportesTecnicos.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento), 
                                                           'conferences': Conferencias.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento), 
                                                           'user': request.user}, context_instance=RequestContext(request))
    else:
        return render_to_response('depto/publicaciones.html', {'Departamento': depto, 
                                                           'books': Libros.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento),
                                                           'magazines': Revistas.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento),
                                                           'tesis': Tesis.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento),
                                                           'papers': Papers.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento),
                                                           'reports': ReportesTecnicos.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento), 
                                                           'conferences': Conferencias.objects.filter(departamentos__Nombre_departamento = depto.Nombre_departamento), 
                                                           'user': request.user}, context_instance=RequestContext(request))
    
def listarlineas(request, object_id=0):
    depto = obtenerDepto(request, object_id)
    if depto == 'No existe el objeto departamento':
        return render_to_response('error.html',{'error':'No existe el objeto departamento', 'archivo': 'view de departamentos', 'linea': 'linea 20'})

    request.breadcrumbs([('Departamentos',reverse(inicio)),('Listar Lineas de '+depto.Nombre_departamento,request.path)])
    return render_to_response('depto/lineas.html', {'Departamento': depto, 'list_lineas': obtenerLineas(depto), 'user': request.user}, context_instance=RequestContext(request))

def listargrupos(request, object_id=0):
    depto = obtenerDepto(request, object_id)
    if depto == 'No existe el objeto departamento':
        return render_to_response('error.html',{'error':'No existe el objeto departamento', 'archivo': 'view de departamentos', 'linea': 'linea 20'})

    request.breadcrumbs([('Departamentos',reverse(inicio)),('Listar Grupos de '+depto.Nombre_departamento,request.path)])
    return render_to_response('depto/grupos.html', {'Departamento': depto, 'list_grupos': depto.grupos.all(), 'user': request.user}, context_instance=RequestContext(request))

def listarproyectos(request, object_id=0):
    depto = obtenerDepto(request, object_id)
    if depto == 'No existe el objeto departamento':
        return render_to_response('error.html',{'error':'No existe el objeto departamento', 'archivo': 'view de departamentos', 'linea': 'linea 20'})

    request.breadcrumbs([('Departamentos',reverse(inicio)),('Listar Proyectos de '+depto.Nombre_departamento,request.path)])
    return render_to_response('depto/proyectos.html', {'Departamento': depto, 'list_proyectos': obtenerProyectos(depto), 'user': request.user}, context_instance=RequestContext(request))

def listarmiembros(request, object_id=0):
    depto = obtenerDepto(request, object_id)
    if depto == 'No existe el objeto departamento':
        return render_to_response('error.html',{'error':'No existe el objeto departamento', 'archivo': 'view de departamentos', 'linea': 'linea 20'})

    request.breadcrumbs([('Departamentos',reverse(inicio)),('Listar Miembros de '+depto.Nombre_departamento,request.path)])
    return render_to_response('depto/miembros.html', {'Departamento': depto, 'list_miembros': obtenerMiembros(depto), 'user': request.user}, context_instance=RequestContext(request))

def listarpartners(request, object_id=0):
    depto = obtenerDepto(request, object_id)
    if depto == 'No existe el objeto departamento':
        return render_to_response('error.html',{'error':'No existe el objeto departamento', 'archivo': 'view de departamentos', 'linea': 'linea 20'})

    request.breadcrumbs([('Departamentos',reverse(inicio)),('Listar Parners de '+depto.Nombre_departamento,request.path)])
    return render_to_response('depto/partners.html', {'Departamento': depto, 'list_partners': obtenerPartners(depto), 'user': request.user}, context_instance=RequestContext(request))

def ajax_get_director_view(request,key_xhr):
    response_dict = {}
    dl = Departamentos.objects.all()
    ddl = []
    for ed in dl:
        ddl.append(ed.Director.get_full_name())
    response_dict.update({'list':ddl})  
    return HttpResponse(simplejson.dumps(response_dict),mimetype = 'application/javascript')

def generarCV(request , object_id):
    depto = obtenerDepto(request, object_id)
    if depto == 'No existe el objeto departamento':
        return render_to_response('error.html',{'errors':'No existe el objeto departamento', 'archivo': 'view de departamentos', 'linea': 'linea 20'})
    
    list_grupos = list(depto.grupos.all())
    list_lineas = list(obtenerLineas(depto))
    list_proyectos = list(obtenerProyectos(depto))
    list_miembros = list(obtenerMiembros(depto))
    list_partners = list(obtenerPartners(depto))

    nombre = "CV_" + unicodedata.normalize('NFKD', depto.Nombre_departamento).encode('ascii','ignore').replace(" ", "")

    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'inline; filename=%s' % nombre

    doc = SimpleDocTemplate(response, pagesize=A4, title=nombre, author="LED UCA")

    story = []

    h1 = PS (name = 'Heading 1', fontSize = 16, leading = 16, alignment = 1, textColor = colors.darkgreen)
    h2 = PS (name = 'Heading 2', fontSize = 12, leading = 14, alignment = 0, textColor = colors.blue)
    h2c = PS (name = 'Heading 2', fontSize = 12, leading = 14, alignment = 1, textColor = colors.blue)
    h3 = PS (name = 'Heading 3', fontSize = 12, leading = 14, alignment = 0)
    h3c = PS (name = 'Heading 3', fontSize = 12, leading = 14, alignment = 1)
    body_style = PS (name = 'Body', fontSize = 10, leading = 12)
    table_style = TableStyle ([ ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('BOX', (0,0), (-1,-1), 0.25, colors.white) ])

    P = Paragraph("Informe de Departamento", h1)
    story.append(P)
#--------------------------------------------------------------------------------------------
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))
    path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + depto.Imagen.url.replace('/',os.sep)
    img = Image(path, width=140, height=140)
    img.hAlign = 'CENTER'
    story.append(img)
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))


    story.append(Paragraph("Departamento", h2c))
    story.append(Spacer(0,6))
    story.append(Paragraph(depto.Nombre_departamento, h3c))
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))

    directorProfile = depto.Director.get_profile()
    directorTitle = directorProfile.titulo + " " if directorProfile and directorProfile.titulo != '---' else ""
    nombreDirector =  directorTitle + depto.Director.first_name + " " + depto.Director.last_name

    story.append(Paragraph("Director", h2c))
    story.append(Spacer(0,6))
    story.append(Paragraph(nombreDirector, h3c))
    story.append(Spacer(0,6))
    story.append(Paragraph(depto.Director.email, h3c))
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))

    if depto.Fecha_creacion:
        story.append(Paragraph("Fecha de creacion", h2c))
        story.append(Spacer(0,6))
        story.append(Paragraph(str(depto.Fecha_creacion), h3c))
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))

    if depto.Descripcion_dpto and depto.Descripcion_dpto != "":
        story.append(Paragraph("Descripción", h2c))
        story.append(Spacer(0,6))
        story.append(Paragraph(depto.Descripcion_dpto, h3c))
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))

    story.append(PageBreak())

    #--------------------------------------------------------------------------------------------
    if list_miembros:
        P = Paragraph("Miembros del departamento:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_miembros:
            respTitle = ''
            if p.get_profile().titulo and p.get_profile().titulo != '---':
                respTitle = p.get_profile().titulo + ' '
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.get_profile().foto.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([
                img,
                [Paragraph(respTitle + p.first_name + ' ' + p.last_name, h3), Paragraph(p.email, body_style)]
            ])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_miembros.__len__()),1,colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_grupos:
        story.append(Spacer(0,12))
        P = Paragraph("Grupos de investigación del departamento:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_grupos:
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.Imagen.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([img, [Paragraph(p.Nombre_grupo,h3), Paragraph(p.Descripcion_grupo,body_style)]])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_grupos.__len__()),1, colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_lineas:
        story.append(Spacer(0,12))
        P = Paragraph("Líneas de investigación del departamento:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_lineas:
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.Imagen.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([img, [Paragraph(p.Nombre_linea,h3), Paragraph(p.Descripcion_linea,body_style)]])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_lineas.__len__()),1, colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_proyectos:
        story.append(Spacer(0,12))
        P = Paragraph("Proyectos de investigación del departamento:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_proyectos:
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.Imagen.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([img, [Paragraph(p.Nombre_proyecto,h3), Paragraph(p.Descripcion_proyecto,body_style)]])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_proyectos.__len__()),1, colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_partners:
        story.append(Spacer(0,12))
        P = Paragraph("Partners del departamento:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_partners:
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.Imagen.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([img, [Paragraph(p.Nombre_partner,h3), Paragraph(p.Descripcion_partner,body_style)]])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_partners.__len__()),1, colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
#--------------------------------------------------------------------------------------------

    doc.build(story)

    return response   


